/*
 * Copyright (c) 2015 Tencent.
 * All rights reserved.
 */

#ifndef __TXD_UDP_H__
#define __TXD_UDP_H__

#include "txd_stdtypes.h"
#include "txd_baseapi.h"

#ifdef __cplusplus
extern "C" {
#endif


/*************************** udp 接口 *********************************/

/**  创建udp socket
 * @note 注意port为本地字节序
 * @param port 绑定的端口号
 *
 * @return udp socket
 */
extern txd_socket_handler_t* txd_udp_socket_create(uint16_t port);


/**  接收数据
 * @remarks 从socket中接收数据到buf[0:len)中，超时时间为timeout_ms毫秒
 * @param sock udp_socket
 * @param ip 出参，用于保存对端的ip，是以'\0'结尾的字符串，比如："192.168.1.1"
 * @param ip_len 为出参ip的缓冲区大小
 * @param port 出参，用于保存对端的port，注意port为本地字节序
 * @param buf 接收缓冲区的首地址
 * @param len 接收缓冲区buf的大小
 * @param timeout_ms 超时时间，单位：毫秒
 *
 * @return -1 表示发生错误
 *         0 表示在timeout_ms时间内没有收到数据，属于正常情况
 *         正数 表示收到的字节数
 */
extern int32_t txd_udp_recvfrom(txd_socket_handler_t *sock, uint8_t *ip, uint32_t ip_len,
        uint16_t *port, uint8_t *buf, uint32_t len, uint32_t timeout_ms);


/**  发送数据
 * @param sock udp_socket
 * @param ip 对端的IP地址，以'\0'结尾的字符串，比如："192.168.1.1"
 * @param port 对端的port，注意port为本地字节序
 * @param buf 待发送数据的首地址
 * @param len 待发送数据的大小（字节数）
 * @param timeout_ms 超时时间，单位：毫秒
 *
 * @return -1 表示发生错误
 *         0 表示再timeout_ms时间内没有将数据发送出去
 *         正数 表示发送的字节数
 */
extern int32_t txd_udp_sendto(txd_socket_handler_t *sock, uint8_t *ip, uint16_t port,
        uint8_t *buf, uint32_t len, uint32_t timeout_ms);


/**  销毁udp socket
 * @param sock udp_socket
 *
 * @return 0 表示成功
 *         -1 表示失败
 */
extern int32_t txd_udp_socket_destroy(txd_socket_handler_t *sock);


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __TXD_UDP_H__ */
